/*
 * bootloader_receive_function.h
 *
 *  Created on: 2025年6月21日
 *      Author: 82398
 */

#ifndef BOOTLOADER_RECEIVE_FUNCTION_H_
#define BOOTLOADER_RECEIVE_FUNCTION_H_


//#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
//#include "DSP281x_Examples.h"   // DSP281x Examples Include File
//#include  "DSP281x_Sci.h"
// --- 类型定义和宏定义 ---
//


#ifdef __cplusplus
extern "C" {
#endif /* extern "C" */
#include "DSP28x_Project.h"   // DSP281x Examples Include File
#include <stdbool.h>
/************************************宏定义*********************** */
#define jumpApp                 (void (*)(void))(0x328000)  //跳转到ap
#define APP_UPDATA_SUCCESS      0x55AA                      //升级是否成功
#define APP_UPDATA_FALG_ADDR    0x338000                    //升级标志地址
#define STATUSS_SUCCESS         0                           //升级成功

#define RX_BUFFER_SIZE 256       // 接收环形缓冲器的大小
// 协议帧起始字节
#define PROTOCOL_START_BYTE 0xEB

// 定义最大的协议帧长度（包括0xEB和长度字段本身）
// 协议中 '长度' 字段为1字节，其最大值为 255。
// 这个 '长度' 字段表示 '0xEB' 之后的所有字节数。
// 因此，整个帧的最大字节数是 1 (0xEB) + 255 (Max Length Value) = 256 字节。
#define MAX_PROTOCOL_FRAME_LEN  256

// 协议中固定的命令帧长度 (eb 08 Command Data1 Data2 Data3 CHECKSUM_L CHECKSUM_H)
#define COMMAND_FRAME_LEN   8       // 协议中的长度字段值为8 (表示整个帧是8字节)

// 数据传输帧的长度 (eb 85 Command Data[128] CHECKSUM_L CHECKSUM_H)
#define FIXED_DATA_FRAME_LEN 133    // 协议中的长度字段值为0x85 (表示整个帧是133字节)
#define OTA_DATA_LEN         128    // 协议中的长度字段值为0x85 (表示整个帧是133字节)
// 命令定义
#define CMD_START_UPGRADE          0x01
#define CMD_TRANSMIT_DATA          0x02
#define CMD_DATA_TRANSFER_COMPLETE 0x03

// 从机响应命令定义
#define RSP_ACK_START_UPGRADE       0xA1
#define RSP_ACK_TRANSMIT_DATA       0xA2
#define RSP_ACK_DATA_TRANSFER_COMPLETE 0xA3

// 响应状态码
#define RSP_SUCCESS                 0x00
#define RSP_ERROR                   0xFF

// 错误代码定义
typedef enum
{
    BOOT_SUCCESS = 0,
    BOOT_ERR_INVALID_START_BYTE,
    BOOT_ERR_INVALID_LENGTH,
    BOOT_ERR_CHECKSUM_MISMATCH,
    BOOT_ERR_UNKNOWN_COMMAND,
    BOOT_ERR_RX_TIMEOUT,
    BOOT_ERR_BUSY,
    BOOT_ERR_INTERNAL,
    BOOT_ERR_FLASH_ERASE,
    BOOT_ERR_FLASH_WRITE
} BootloaderStatus;

// --- 全局变量声明 ---
extern volatile unsigned char g_rx_buffer[MAX_PROTOCOL_FRAME_LEN]; // 接收缓冲区
extern volatile unsigned int g_rx_byte_count;                     // 当前接收到的字节数/索引
extern volatile bool g_frame_ready;                               // 完整帧接收标志

extern Uint32 g_expected_data_size;                 // 期望的总数据包大小 (由CMD_DATA_TRANSFER_COMPLETE命令设置)
extern Uint32 g_received_data_count;                // 已接收的数据字节总数
// --- 环形缓冲器定义 ---

extern Uint16 rx_buffer[RX_BUFFER_SIZE];    // 环形缓冲器数组
extern volatile Uint16 rx_buffer_write_idx; // 写入索引
extern volatile Uint16 rx_buffer_read_idx;  // 读取索引
extern volatile Uint16 rx_buffer_count;     // 缓冲器中当前的数据量
// --- 环形缓冲器定义结束 ---
//extern Uint16 rdataA[8];    // Received data for SCI-A
//extern Uint16 sdataA[8];    // Send data for SCI-A
//extern Uint16 rdata_pointA; // Used for checking the received data

//// 协议帧起始字节
//#define PROTOCOL_START_BYTE 0xEB
//
//// 协议命令长度 (命令帧的长度，包括起始字节、长度、命令、数据字节(这里是3个占位符)和校验)
//// eb 08 Command Data1 Data2 Data3 CHECKSUM_L CHECKSUM_H
//#define COMMAND_FRAME_LEN   8
//
//// 数据传输帧长度 (数据帧的长度，包括起始字节、长度、命令、128字节数据和校验)
//// eb 85 Command Data[128] CHECKSUM_L CHECKSUM_H
//#define DATA_FRAME_LEN      (1 + 1 + 1 + 128 + 2) // 0xEB + 长度 + 命令 + 128字节数据 + 校验
//
//// 命令定义
//#define CMD_START_UPGRADE          0x01 // 主机开始升级命令
//#define CMD_TRANSMIT_DATA          0x02 // 主机传输数据命令
//#define CMD_DATA_TRANSFER_COMPLETE 0x03 // 主机数据包发送完毕命令
//
//// 从机响应命令定义 (响应命令通常是主机命令 + 0xA0)
//#define RSP_ACK_START_UPGRADE       0xA1 // 从机确认可以升级或请求重发 (0xA1 + 0x00/0xFF)
//#define RSP_ACK_TRANSMIT_DATA       0xA2 // 从机确认数据正确或请求重发 (0xA2 + 0x00/0xFF)
//#define RSP_ACK_DATA_TRANSFER_COMPLETE 0xA3 // 从机确认数据完整或请求重新升级 (0xA3 + 0x00/0xFF)
//
//// 响应状态码
//#define RSP_SUCCESS                 0x00 // 成功
//#define RSP_ERROR                   0xFF // 错误/请求重发
//
//// 错误代码定义
//typedef enum
//{
//    BOOT_SUCCESS = 0,
//    BOOT_ERR_INVALID_START_BYTE,
//    BOOT_ERR_INVALID_LENGTH,
//    BOOT_ERR_CHECKSUM_MISMATCH, // CHECKSUM
//    BOOT_ERR_UNKNOWN_COMMAND,
//    BOOT_ERR_RX_TIMEOUT,
//    BOOT_ERR_BUSY,                // 例如，正在处理上一个包
//    BOOT_ERR_INTERNAL             // 其他未定义的内部错误
//} BootloaderStatus;
//
//// --- 全局变量/状态机变量 ---
//extern unsigned char g_rx_buffer[DATA_FRAME_LEN]; // 接收缓冲区
//extern Uint32 g_expected_data_size;     // 期望的总数据包大小 (由CMD_DATA_TRANSFER_COMPLETE命令设置)
//extern Uint32 g_received_data_count;    // 已接收的数据字节总数

// --- 函数声明 ---
 static unsigned int calculate_checksum(const unsigned char *data, unsigned int length); // 替换 CRC
static void send_response(unsigned char command, unsigned char status);
static BootloaderStatus receive_byte_timeout(unsigned char *byte_data, unsigned int timeout_ms);


/************************************函数声明*********************** */
void app_updata_chk(void);
Uint16 APP_Updata(void);
Uint16 AppHybridData_Deal(Uint16 *data, Uint32 *addr);
Uint16 Program_FlashAdder(Uint16 *startaddr, Uint16 *data, Uint16 len);

/***************************变量声明************************************** */
extern char *ReceivedChar;










#ifdef __cplusplus
}
#endif /* extern "C" */

#endif /* BOOTLOADER_RECEIVE_FUNCTION_H_ */
